```python
from typing import Optional

from pydantic import Field

from app.agent.base import BaseAgent
from app.llm import LLM
from app.logger import logger
from app.prompt.cot import NEXT_STEP_PROMPT, SYSTEM_PROMPT
from app.schema import AgentState, Message


class CoTAgent(BaseAgent):
    """
    Chain of Thought Agent - 专注于展示大型语言模型的思考过程，而不执行工具

    Attributes:
        name (str): 代理的名称，默认为 "cot"。
        description (str): 代理的描述，用于说明其使用 Chain of Thought 推理。
        system_prompt (str): 系统提示，用于引导代理的初始行为。
        next_step_prompt (Optional[str]): 下一步提示，可选，用于引导代理的下一步思考。
        llm (LLM): 大型语言模型实例，用于执行推理。
        max_steps (int): 最大步骤数，CoT 通常只需要一步即可完成推理。
    """

    name: str = "cot"
    description: str = "An agent that uses Chain of Thought reasoning"

    system_prompt: str = SYSTEM_PROMPT
    next_step_prompt: Optional[str] = NEXT_STEP_PROMPT

    llm: LLM = Field(default_factory=LLM)

    max_steps: int = 1  # CoT typically only needs one step to complete reasoning

    async def step(self) -> str:
        """
        执行链式思考推理的一步

        Returns:
            str: 代理的推理结果。

        Notes:
            - 如果存在 next_step_prompt 并且这不是第一个消息，则将其添加到用户消息中。
            - 使用系统提示和用户消息来获取推理结果。
            - 记录助手的响应并将其添加到内存中。
            - 推理完成后，将状态设置为 FINISHED。
        """
        logger.info(f"🧠 {self.name} is thinking...")

        # If next_step_prompt exists and this isn't the first message, add it to user messages
        if self.next_step_prompt and len(self.messages) > 1:
            self.memory.add_message(Message.user_message(self.next_step_prompt))

        # Use system prompt and user messages
        response = await self.llm.ask(
            messages=self.messages,
            system_msgs=[Message.system_message(self.system_prompt)]
            if self.system_prompt
            else None,
        )

        # Record assistant's response
        self.memory.add_message(Message.assistant_message(response))

        # Set state to finished after completion
        self.state = AgentState.FINISHED

        return response
```

### 代码说明：
- **CoTAgent 类**：
  - 该类继承自 `BaseAgent`，专注于展示大型语言模型的思考过程，而不执行工具。
  - 属性 `system_prompt` 和 `next_step_prompt` 用于引导推理过程。
  - `max_steps` 属性表示推理只需要一步即可完成。

- **step 方法**：
  - 该方法执行链式思考推理的一步。
  - 如果存在 `next_step_prompt` 并且这不是第一个消息，则将其添加到用户消息中。
  - 方法使用系统提示和用户消息来获取推理结果，并将助手的响应记录到内存中。
  - 推理完成后，将状态设置为 `FINISHED`。